package com.ht.api.bigtask.impl.qywx;

import java.util.List;

import javax.sql.DataSource;

import com.ht.api.bigtask.BaseBigTask;
import com.ht.api.constant.CacheConstants;
import com.ht.api.db.Db;
import com.ht.api.db.DbConfig;
import com.ht.api.db.DbList;
import com.ht.api.db.Entity;
import com.ht.api.db.StreamLoadConfig;
import com.ht.api.db.exception.HtException;
import com.ht.api.db.util.RedisUtil;
import com.ht.api.open.OpenUtil;

import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import lombok.extern.slf4j.Slf4j;

/**
 * 获取会话内容存档开启成员列表
 * @author asq
 * @createTime 2025年3月27日 11:12:03
 */
@Slf4j
public class GetPermitUserList extends BaseBigTask {
	/** 接口ID：获取会话内容存档开启成员列表 */
	private static final long API_ID = 1905094500028649472L;

	@Override
	protected void doExecute(String appId, JSONObject context, Entity bean) {
		DataSource ds = getTenantDs(appId);
		StreamLoadConfig streamLoadConfig = DbConfig.getStreamLoadConfigByDataSource(ds);
		String str = OpenUtil.call(getKeepAppId(appId), API_ID, JSONUtil.createObj());
		JSONObject obj = JSONUtil.parseObj(str);
		if (obj.getInt("errcode") == 0) {
			JSONArray ids = obj.getJSONArray("ids");
			List<String> idList = ids.stream().map(id -> id.toString()).toList();
			DbList wxWorkUserList = Db.createSqlParser("wx_workuser").where("userid", "in", idList).query(ds);
			wxWorkUserList.stream().forEach(b -> b.set("is_keep", 1));
			Db.insertBatchWithStream(streamLoadConfig, wxWorkUserList);
			log.info("[GetPermitUserList]企微初始化，获取会话内容存档开启成员列表，总数：{}", wxWorkUserList.size());
		} else {
			log.error("[GetPermitUserList]企微初始化，获取会话内容存档开启成员列表时返回失败：{}", obj.getStr("errmsg"));
		}
	}
	
	/**
	 * 获取应用配置的会话存档应用ID
	 * @param appId 主应用ID
	 * @return
	 */
	private String getKeepAppId(String appId) {
		Entity app = RedisUtil.get(CacheConstants.KEY_APP + appId);
		JSONObject appConfig = JSONUtil.parseObj(app.getStr("config"));
		String addressBookAppId = appConfig.getStr("session_keep_id");
		if (addressBookAppId != null) {
			return addressBookAppId;
		} else {
			throw new HtException("应用未配置对应的会话存档应用ID，无法获取会话内容存档开启成员列表");
		}
	}

}
